package cn.hznc.excel;

import cn.hznc.domain.entity.ToolImportAnalysisEntity;
//import cn.hznc.dto.ToolImportAnalysisEntity;
import cn.hznc.exception.SystemEx;
import cn.hznc.exception.SystemException;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.metadata.CellExtra;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;

import java.lang.reflect.Field;
import java.util.List;
@Slf4j
public class ToolImportAnalysisListener implements ReadListener<ToolImportAnalysisEntity> {
    private Integer headRowNumber = null;
    /**
     * 1000条数据存入数据库，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 1000;

    private List<ToolImportAnalysisEntity> excels = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    /**
     * 缓存的数据
     */
    private List<ToolImportAnalysisEntity> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    public ToolImportAnalysisListener(List<ToolImportAnalysisEntity> cityExcels) {
        this.excels = cityExcels;
    }

    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
//        if (cachedDataList.size() > BATCH_COUNT) {
//            throw new SystemException(SystemEx.FILE_EXCEL_MAX_COLUMN_ERROR.getCode(),SystemEx.FILE_EXCEL_MAX_COLUMN_ERROR.getMsg());
//        }
//        throw exception;
        System.err.println("解析失败，但是继续解析下一行: " + exception.getMessage());
        // 如果是某一个单元格的转换异常 能获取到具体行号
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
            System.err.println("第{}行，第{}列解析异常" + excelDataConvertException.getRowIndex() +
                    excelDataConvertException.getColumnIndex());
        }

    }

    @Override
    public void invoke(ToolImportAnalysisEntity ToolImportAnalysisEntity, AnalysisContext analysisContext) {
        log.info("解析到一条数据:{}", JSON.toJSONString(ToolImportAnalysisEntity));
        excels.add(ToolImportAnalysisEntity);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("地址读取完毕！");
    }

    /**
     * 获取导入数据
     *
     * @return
     */
    public List<ToolImportAnalysisEntity> getImportData(){
        return excels;
    }
//    @SneakyThrows
//    @Override
//    public void extra(CellExtra extra, AnalysisContext context) {
//        // 解析合并单元格的信息 利用反射给合并的单元格读不到值时，进行赋值
//        if(headRowNumber==null){
//            headRowNumber = context.readSheetHolder().getHeadRowNumber();
//        }
//        // 获取合并后的第一个索引
//        Integer index = extra.getFirstRowIndex() - headRowNumber;
//        // 获取合并后的最后一个索引
//        Integer lastRowIndex = extra.getLastRowIndex() - headRowNumber;
//        // 获取合并后的第一个值
//        ToolImportAnalysisEntity t = excels.get(index);
//        // 利用反射获取所有私有属性
//        Field[] fields = t.getClass().getDeclaredFields();
//        for (Field field:fields) {
//            // 让该属性可操作
//            field.setAccessible(true);
//            // 获取EasyExcel 原有注解
//            ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
//            // 循环遍历空缺的值
//            for (int i = index+1; i <= lastRowIndex; i++) {
//                // 当读取的列索引等于注解的索引时，表示就是该属性赋值
//                if (extra.getFirstColumnIndex().equals(annotation.index())){
//                    // 利用反射赋值
//                    field.set(excels.get(i),field.get(t));
//                }
//            }
//        }
//    }
}
